import { app, shell, BrowserWindow, ipcMain } from 'electron';
import { join } from 'path';
import { electronApp, optimizer, is } from '@electron-toolkit/utils';
import icon from '../../resources/icon.png?asset';
import { createTray } from './createTray.js';
import { checkUpdate } from './checkUpdate';
import { bridgeKeys } from '../renderer/src/utils/dicts.js';
import { useEvent } from './event';

function createWindow() {
  // 创建浏览器窗口.
  const mainWindow = new BrowserWindow({
    width: 1440,
    height: 670,
    show: false,
    autoHideMenuBar: true,
    frame: false,
    ...(process.platform === 'linux' ? { icon } : {}),
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'),
      sandbox: false,
    },
  });
  mainWindow.on('ready-to-show', () => {
    // 当窗口的网页内容（如 HTML、CSS、JavaScript 等资源）加载完成并且渲染引擎已经完成布局和绘制，此时窗口已经处于可以显示的状态，就会触发 ready-to-show 事件
    console.log('ready-to-show----');
    mainWindow.show();
  });

  mainWindow.once('ready-to-show', () => {
    const currentVersion = app.getVersion(); // 当前应用版本
    createTray(); // 创建系统托盘
    const { on, send } = useEvent({ mainWindow });
    checkUpdate({
      downloadProgress(info) {
        // 监听下载进度条
        send.downloadProgress(info, currentVersion);
      },
      updateAvailable: (info) => {
        // 发现新版本
        send.updateAvailable(info, currentVersion);
      },
      updateDownloaded() {
        // 已下载完成
        send.updateDownloaded();
      },
    }); // 检查是否有更新

    on.quitAndInstall(); // 退出系统并安装
    on.maximize(); // 监听设置窗口最大化
    on.minimize(); // 监听设置窗口最小化
    on.quit(); // 监听退出应用
    on.changeCacheDirectory(); // 监听更改缓存目录
    send.getCachePath(); // 发送 本地缓存的目录
    on.clearCache(); // 监听 清除缓存
  });
  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url);
    return { action: 'deny' };
  });

  // HMR for renderer base on electron-vite cli.
  // 加载用于开发的远程URL或用于生产的本地html文件.
  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']);
  } else {
    mainWindow.loadFile(join(__dirname, '../renderer/index.html'));
  }
}

// 这个方法将在Electron完成时被调用
// 初始化并准备创建浏览器Windows.
// 有些api只能在此事件发生后使用.
app.whenReady().then(() => {
  // Set app user model id for windows
  electronApp.setAppUserModelId('com.electron');

  // 在开发中默认通过F12打开或关闭DevTools
  // 在生产环境中忽略 CommandOrControl + R.
  // 参见https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
  // TODO 暂时注释
  /*app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window);
  });*/

  createWindow();

  app.on('activate', function () {
    // 在MacOS上，在应用程序中重新创建一个窗口是很常见的
    // 点击Dock图标，没有其他窗口打开.
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

// 当所有窗口都关闭时退出，除了macOS。在那里，这很常见
// 使应用程序及其菜单栏保持活动状态，直到用户退出
// 显式地使用Cmd + Q.
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    // process.platform 'darwin'：macOS。'win32'：Windows。'linux'：Linux。
    app.quit();
  }
});
